]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
perf: Add basic run tests
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 31 Jul 2020 01:42:01 +0000 (03:42 +0200)
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Wed, 12 Aug 2020 15:43:39 +0000 (15:43 +0000)
While the performance framework was originally written to collect
performance metrics, driving the shell by an automated script is
also useful to ensure that basic functionality is working.

Add such a basic test, initially checking top bar menus, notifications
and the overview.

Eventually it would be nice to separate the automatic scripting from
gathering performance metrics, but IMHO that can wait until we switch
from gjs' custom imports system to ES modules.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1396

js/js-resources.gresource.xml
js/perf/basic.js [new file with mode: 0644]

index 07e134353cc192b110550440492fa3d4145841b2..26878daf8fc4fcbf75f00dcefec67a86bcaacca5 100644 (file)
@@ -32,6 +32,7 @@
     <file>misc/util.js</file>
     <file>misc/weather.js</file>
 
+    <file>perf/basic.js</file>
     <file>perf/core.js</file>
     <file>perf/hwtest.js</file>
 
diff --git a/js/perf/basic.js b/js/perf/basic.js
new file mode 100644 (file)
index 0000000..718532f
--- /dev/null
@@ -0,0 +1,146 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+/* exported run, finish, script_topBarNavDone, script_notificationShowDone,
+   script_notificationCloseDone, script_overviewShowDone,
+   script_applicationsShowStart, script_applicationsShowDone, METRICS,
+*/
+/* eslint camelcase: ["error", { properties: "never", allow: ["^script_"] }] */
+
+const { St } = imports.gi;
+
+const Main = imports.ui.main;
+const MessageTray = imports.ui.messageTray;
+const Scripting = imports.ui.scripting;
+
+// This script tests the most important (basic) functionality of the shell.
+
+var METRICS = {};
+
+async function run() {
+    /* eslint-disable no-await-in-loop */
+    Scripting.defineScriptEvent('topBarNavStart', 'Starting to navigate the top bar');
+    Scripting.defineScriptEvent('topBarNavDone', 'Done navigating the top bar');
+    Scripting.defineScriptEvent('notificationShowStart', 'Showing a notification');
+    Scripting.defineScriptEvent('notificationShowDone', 'Done showing a notification');
+    Scripting.defineScriptEvent('notificationCloseStart', 'Closing a notification');
+    Scripting.defineScriptEvent('notificationCloseDone', 'Done closing a notification');
+    Scripting.defineScriptEvent('overviewShowStart', 'Starting to show the overview');
+    Scripting.defineScriptEvent('overviewShowDone', 'Overview finished showing');
+    Scripting.defineScriptEvent('applicationsShowStart', 'Starting to switch to applications view');
+    Scripting.defineScriptEvent('applicationsShowDone', 'Done switching to applications view');
+
+    Main.overview.connect('shown',
+        () => Scripting.scriptEvent('overviewShowDone'));
+
+    await Scripting.sleep(1000);
+
+    // navigate through top bar
+    Scripting.scriptEvent('topBarNavStart');
+    Main.panel.statusArea.aggregateMenu.menu.open();
+    await Scripting.sleep(400);
+
+    const { menuManager } = Main.panel;
+    while (menuManager.activeMenu &&
+        Main.panel.navigate_focus(menuManager.activeMenu.sourceActor,
+            St.DirectionType.TAB_BACKWARD, false))
+        await Scripting.sleep(400);
+    Scripting.scriptEvent('topBarNavDone');
+
+    await Scripting.sleep(1000);
+
+    // notification
+    const source = new MessageTray.SystemNotificationSource();
+    Main.messageTray.add(source);
+
+    Scripting.scriptEvent('notificationShowStart');
+    source.connect('notification-show',
+        () => Scripting.scriptEvent('notificationShowDone'));
+
+    const notification = new MessageTray.Notification(source,
+        'A test notification');
+    source.showNotification(notification);
+    await Scripting.sleep(400);
+
+    Main.panel.statusArea.dateMenu.menu.open();
+    await Scripting.sleep(400);
+
+    Scripting.scriptEvent('notificationCloseStart');
+    notification.connect('destroy',
+        () => Scripting.scriptEvent('notificationCloseDone'));
+
+    notification.destroy();
+    await Scripting.sleep(400);
+
+    Main.panel.statusArea.dateMenu.menu.close();
+    await Scripting.waitLeisure();
+
+    await Scripting.sleep(1000);
+
+    // overview (window picker)
+    Scripting.scriptEvent('overviewShowStart');
+    Main.overview.show();
+    await Scripting.waitLeisure();
+    Main.overview.hide();
+    await Scripting.waitLeisure();
+
+    await Scripting.sleep(1000);
+
+    // overview (app picker)
+    Main.overview.show();
+    await Scripting.waitLeisure();
+
+    Scripting.scriptEvent('applicationsShowStart');
+    // eslint-disable-next-line require-atomic-updates
+    Main.overview.dash.showAppsButton.checked = true;
+    await Scripting.waitLeisure();
+    Scripting.scriptEvent('applicationsShowDone');
+    // eslint-disable-next-line require-atomic-updates
+    Main.overview.dash.showAppsButton.checked = false;
+    await Scripting.waitLeisure();
+
+    Main.overview.hide();
+    await Scripting.waitLeisure();
+    /* eslint-enable no-await-in-loop */
+}
+
+let topBarNav = false;
+let notificationShown = false;
+let notificationClosed = false;
+let windowPickerShown = false;
+let appPickerShown = false;
+
+function script_topBarNavDone() {
+    topBarNav = true;
+}
+
+function script_notificationShowDone() {
+    notificationShown = true;
+}
+
+function script_notificationCloseDone() {
+    notificationClosed = true;
+}
+
+function script_overviewShowDone() {
+    windowPickerShown = true;
+}
+
+function script_applicationsShowDone() {
+    appPickerShown = true;
+}
+
+function finish() {
+    if (!topBarNav)
+        throw new Error('Failed to navigate top bar');
+
+    if (!notificationShown)
+        throw new Error('Failed to show notification');
+
+    if (!notificationClosed)
+        throw new Error('Failed to close notification');
+
+    if (!windowPickerShown)
+        throw new Error('Failed to show window picker');
+
+    if (!appPickerShown)
+        throw new Error('Failed to show app picker');
+}